﻿using System;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace Cataloger
{
    /// <summary>
    /// Klasa reprezentująca wpis w pliku archiwalnym odnosi się tak do pliku jak i folderu.
    /// Obiekty klasy PlikArchiwumRar oraz PlikArchiwumZip gromadzą obiekty tej klasy.
    /// </summary>
    [Serializable]
    public class ArchiwumEntry
    {
		#region Fields (6) 

        /// <summary>
        /// Czy dany wpis jest folderem. Jeżeli tak to TRUE, w przypadku
        /// gdy jest plikiem to FALSE.
        /// </summary>
        bool czyFolder;
        DateTime dataModyfikacj;
        /// <summary>
        /// Nazwa wpisu bedąca scieżką do danego pliku/folderu wewnątrz archiwum
        /// Przykładowo jezeli wpis jest plikiem o nazwie "test.txt" znajdującym się
        /// w folderze A który znajduje się w archiwum "ARCH.ZIP" to jego nazwa będzie
        /// wyglądała tak: "A/test.txt"
        /// </summary>
        string nazwa;
        /// <summary>
        /// Plik w którym znajduje się dany wpis np. dla wpisu bedącego
        /// plikiem "test.txt" znajdującego się w pliku "ARCH.ZIP", plikArchiwumRodzic
        /// będzie odniesiem do pliku "ARCH.ZIP"
        /// </summary>
        Plik plikArchiwumRodzic;
        /// <summary>
        /// Rozmiar pliku przed kompresją
        /// </summary>
        long rozmiarPrzed;
        /// <summary>
        /// Rozmiar pliku po kompresji
        /// </summary>
        long rozmirPo;

		#endregion Fields 

		#region Constructors (2) 

        /// <summary>
        /// Tworzy nowy obiekt klasy <see cref="ArchiwumEntry"/>.
        /// </summary>
        /// <param name="nazwa">Nazwa wpisu</param>
        /// <param name="dataMod">Data modyfikacji</param>
        /// <param name="rozmiarPrzed">Rozmiar przed kompresją</param>
        /// <param name="rozmiarPo">Rozmiar po kompresji</param>
        /// <param name="czyFolder">Jeżeli ustawione na true wpis jest folderem</param>
        /// <param name="skad">Plik w jakim znajduje się dany wpis</param>
        public ArchiwumEntry(string nazwa, DateTime dataMod, long rozmiarPrzed, long rozmiarPo, bool czyFolder,Plik skad)
        {
            this.nazwa = nazwa;
            this.dataModyfikacj=dataMod;
            this.rozmiarPrzed=rozmiarPrzed;
            this.rozmirPo = rozmiarPo;
            this.czyFolder = czyFolder;
            this.plikArchiwumRodzic = skad;
        }

		#endregion Constructors 

		#region Properties (7) 

        public bool CzyFolder
        {
            get { return czyFolder; }
        }

        public DateTime DataModyfikacj
        {
            get { return dataModyfikacj; }
        }
        public string Sciezka
        {
            get { return Path.Combine(plikArchiwumRodzic.Sciezka, this.nazwa); }
        }
        public string Nazwa
        {
            get { return nazwa; }
        }

        /// <summary>
        /// Podaje tylko nazwe wpisu np tekst.txt
        /// </summary>
        public string NazwaBezSciezki
        {
            get { return Path.GetFileName(nazwa); }
        }

        public Plik PlikArchiwumRodzic
        {
            get { return plikArchiwumRodzic; }
         }

        public long RozmiarPrzed
        {
            get { return rozmiarPrzed; }
        }

        public long RozmirPo
        {
            get { return rozmirPo; }
        }
        public string Opis
        {
            get;
            set;
        }
		#endregion Properties 

		#region Methods (2) 

		// Public Methods (2) 

        /// <summary>
        /// Metoda tworząca opis obiektu tej klasy
        /// Zawiera informacje o nazwie, dacie, i rozmiarze
        /// </summary>
        /// <returns></returns>
        public string CalkowiteInfo()
        {
            StringBuilder st=new StringBuilder();
            st.AppendLine("Nazwa: \t" + this.nazwa);
            st.AppendLine("Data: \t" + this.dataModyfikacj.ToShortDateString()+"  "+this.dataModyfikacj.ToShortTimeString());
            st.AppendLine("Rozmiar przed: \t" + this.rozmiarPrzed.ToProperUnit());
            st.AppendLine("Rozmiar po: \t" + this.rozmirPo.ToProperUnit());
            return st.ToString();
        }

        /// <summary>
        /// Wyswietla informacje o danym wpisie na listview
        /// </summary>
        /// <param name="listView1">The list view1.</param>
        public void ShowAEListView(ListView listView1)
        {
            listView1.Items.Add(new ListViewItem(new string[] { this.PlikArchiwumRodzic.Nosnik.Katalog.Nazwa,
                                                                this.PlikArchiwumRodzic.Nosnik.NazwaAlias, this.NazwaBezSciezki,
                                                                this.RozmiarPrzed.ToProperUnit(), this.DataModyfikacj.ToShortDateString(),
                                                                this.DataModyfikacj.ToShortDateString(), this.DataModyfikacj.ToShortDateString(), 
                                                                Path.GetExtension(this.Nazwa).ToString(), "", "", 
                                                                this.Sciezka }));
            listView1.Items[listView1.Items.Count - 1].Tag = this;
        }

		#endregion Methods 
    }
}
